/**
 * 
 */
package com.cn.practice.template;

/**
 * 模板方法模式
 * @author zhangyang
 *
 */
public class TemplatePractice {
public static void main(String[] args) {
	MilkTeaTemplate purpleMilkTea = new PurpleMilkTea("葡萄");
	purpleMilkTea.make();
	MilkTeaTemplate milkTea = new StraBerryMilkTea("草莓");
	milkTea.make();
	/**
	 * spring中关于bean的生命周期就用到了模板模式
	 * AbstractApplicationContext继承ConfigurableApplicationContext接口实现refresh方法
	 * 这个方法就是典型的模板方式发模式
	 * 里面有抽象方法 也有钩子方法 dofresh和dopostBeanProcessor都是钩子方法
	 */
}
}

/**
 * 奶茶模板方法
 * @author zhangyang
 *
 */
abstract class MilkTeaTemplate{
	String name;
	
	public MilkTeaTemplate(String name) {
		super();
		this.name = name;
	}
	//添加原料
	abstract void makeResource();
	//奶茶加料 珍珠 糖 椰果
	abstract void teaAddSth();
	//打包
	abstract void pack();
	//模板构建 不能被重写
	final void make() {
		if(ifMakeResource())
		this.makeResource();
		this.teaAddSth();
		this.pack();
	}
	
	//是否加原料-钩子函数 交给子类重写实现自定义
	boolean ifMakeResource() {
		return true;
	}
}

class PurpleMilkTea extends MilkTeaTemplate{

	public PurpleMilkTea(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}


	@Override
	void makeResource() {
		// TODO Auto-generated method stub
		System.out.println("葡萄奶茶加原料粉");
	}


	@Override
	void teaAddSth() {
		// TODO Auto-generated method stub
		System.out.println("葡萄奶茶加珍珠");
	}

	@Override
	void pack() {
		// TODO Auto-generated method stub
		System.out.println("葡萄奶茶打包");
	}
	
}

class StraBerryMilkTea extends MilkTeaTemplate{

	/**
	 * @param name
	 */
	public StraBerryMilkTea(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}


	@Override
	void makeResource() {
		// TODO Auto-generated method stub
		System.out.println("草莓奶茶什么都不加");
	}


	@Override
	void teaAddSth() {
		// TODO Auto-generated method stub
		System.out.println("草莓奶茶加野果");
	}

	@Override
	void pack() {
		// TODO Auto-generated method stub
		System.out.println("草莓奶茶打包");
	}


	@Override
	boolean ifMakeResource() {
		// TODO Auto-generated method stub
		return false;
	}
	
	
}